/**
 * 
 */
package cn.nawang.ebeim.ui.util;

import java.util.Date;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;

import cn.nawang.ebeim.ui.bean.User;
import cn.nawang.ebeim.ukey.Ukey;

/**
 * @ClassName: DatasourceSecurityRankUtil
 * @Description: 数据源安全级别工具类
 * @author zhangjf
 * @date 2015年10月19日 上午8:00:55
 * @version v1.0
 */
public class DatasourceSecurityRankUtil {
  private static final Logger LOG = LoggerFactory.getLogger(DatasourceSecurityRankUtil.class);
  /**
   * @author zhangjf
   * @Description: 验证数据源安全等级
   * @param @param sr
   * @param @return
   * @return String 
   * @date 2015年10月19日上午8:03:53
   *
   * @修改人 zhangjf
   * @修改日期
   */
  public static JSONObject check(Integer sr,String dynamicCode,HttpSession session){
    
    JSONObject json = new JSONObject();
    switch (sr) {
      case 0:json.put("code", "200");System.out.println("case 0:200..............................");
      break;
      case 1:return checkKey(session);
      case 2:return checkCode(dynamicCode,session);
      case 3:return checkKeyCode(dynamicCode,session);
      default:json.put("code", "200");System.out.println("default:200..............................");
      break;
    }
    return json;
    
  }
  
  /**
   * @author zhangjf
   * @Description: 检查是否有key
   * @param @return
   * @return String 
   * @date 2015年10月19日上午8:14:46
   *
   * @修改人 zhangjf
   * @修改日期
   */
  public static JSONObject checkKey(HttpSession session){
    JSONObject json = new JSONObject();
    User user = (User)session.getAttribute("user");
    String labId = user.getLabId();
    String key = readKey();
    if(key!=null&&labId.equals(key)){
      json.put("code", "200");
    }else{
      json.put("code", "needKey");
    }
    return json;
  }
  
  /**
   * @author zhangjf
   * @Description: 检查动态验证码
   * @param @return
   * @return String 
   * @date 2015年10月19日上午8:16:09
   *
   * @修改人 zhangjf
   * @修改日期
   */
  public static JSONObject checkCode(String dynamicCode,HttpSession session){
    User user = (User)session.getAttribute("user");
    JSONObject json = new JSONObject();
    json.put("mobile", user.getMobile());
    if(checkSessionCode(session)){
      json.put("code", "200");
      System.out.println("sessionCode not null:200..............................");
    }else if(!isCodeEmpty(dynamicCode) && checkDynamicCode(session,dynamicCode)){
      session.setAttribute(SESSION_CODE, dynamicCode);
      session.setAttribute(SESSION_TIME, new Date().getTime());
      json.put("code", "200");
      System.out.println("dynamicCode correct:200..............................");
    }else if(!isCodeEmpty(dynamicCode) && !checkDynamicCode(session,dynamicCode)){
      json.put("code", "codeError");
    }else{
      json.put("code", "needCode");
    }
    return json;
  }
  
  /**
   * @author zhangjf
   * @Description: 判断session是否存在验证码，并且session时间小于SESSION_TIME_SPACING
   * @param @param session
   * @param @return
   * @return boolean 
   * @date 2015年11月6日上午11:37:20
   *
   * @修改人 zhangjf
   * @修改日期
   */
  public static boolean checkSessionCode(HttpSession session){
    String sessionCode = (String) session.getAttribute(SESSION_CODE);
    Long sessionTime = (Long) session.getAttribute(SESSION_TIME);
    Long now = new Date().getTime();
    System.out.println("sessionTime is :"+sessionTime
      +"......now is :"+now+"......"+"now-sessionTime = "+(sessionTime==null?"null":(now-sessionTime))
      +".....SESSION_TIME_SPACING is :"+SESSION_TIME_SPACING);
    if(sessionCode !=null && (now-sessionTime)<SESSION_TIME_SPACING){
      return true;
    }
    return false;
  }
  
  public static boolean isCodeEmpty(String dynamicCode){
    if(dynamicCode == null 
        || dynamicCode.equals("undefined") 
        || dynamicCode.length()==0
        || dynamicCode.equals("null")){
      return true;
    }else{
      return false;
    }
  }
  
  /**
   * @author zhangjf
   * @Description: 检查key和动态验证码
   * @param @return
   * @return String 
   * @date 2015年10月19日上午8:16:47
   *
   * @修改人 zhangjf
   * @修改日期
   */
  public static JSONObject checkKeyCode(String dynamicCode,HttpSession session){
    JSONObject json = new JSONObject();
    User user = (User)session.getAttribute("user");
    json.put("mobile", user.getMobile());
    String sessionCode = (String) session.getAttribute(SESSION_CODE);
    if(sessionCode != null){
      json.put("code", "200");
    }else if(!isCodeEmpty(dynamicCode) && checkDynamicCode(session,dynamicCode)){
      json.put("code", "200");
      session.setAttribute(SESSION_CODE, dynamicCode);
      session.setAttribute(SESSION_TIME, new Date().getTime());
    }else if(!isCodeEmpty(dynamicCode) && !checkDynamicCode(session,dynamicCode)){
      json.put("code", "codeError");
    }else{
      json.put("code", "needCode");
    }
    
    JSONObject checkKey = checkKey(session);
    if(json.getString("code").equals("200")){
      if(!checkKey.getString("code").equals("200")){
        json.put("code", checkKey.getString("code"));
      }
    }
    
    
    return json;
  }
  
  public static JSONObject checkUserRank(User user,String dynamicCode,HttpSession session){
    JSONObject json = new JSONObject();
    json.put("code", "200");
    if(user.getLabType()!=null&&(user.getLabType().equals("1"))){//key不关联
      if(readKey()!=null && user.getLabId().equals(readKey())){
        json.put("code", "200");
      }else{
        json.put("code", "needKey");
      }
    }else if(user.getLabType()!=null&&user.getLabType().equals("3")){//key关联
      if(readKey()!=null && user.getLabId().equals(readKey())){
        if(user.getBindDevice()==null){
          json.put("code", "200");
        }else{
          if(user.getBindDevice().equals(MACAddress.getMACAddr())){
            json.put("code", "200");
          }else{
            json.put("code", "500");
            json.put("message", "该账户已设置key关联设备,此设备无法进行相关操作");
          }
        }
      }else{
        json.put("code", "needKey");
      }
    }else if(user.getLabType()!=null&&user.getLabType().equals("4")){
      json.put("mobile", user.getMobile());
      if(user.getBindDevice()!=null){
        if(user.getBindDevice().equals(MACAddress.getMACAddr())){
          if(checkSessionCode(session)){
            json.put("code", "200");
            System.out.println("sessionCode not null:200..............................");
          }else if(!isCodeEmpty(dynamicCode)&&checkDynamicCode(session,dynamicCode)){
            json.put("code", "200");
          }else if(!isCodeEmpty(dynamicCode)){
            json.put("code", "codeError");
          }else{
            json.put("code", "needCode");
          }
        }else{
          json.put("code", "500");
          json.put("message", "已关联设备，无法在此设备进行该操作！");
        }
      }else{
        if(checkSessionCode(session)){
          json.put("code", "200");
          System.out.println("sessionCode not null:200..............................");
        }else if(!isCodeEmpty(dynamicCode)&&checkDynamicCode(session,dynamicCode)){
          json.put("code", "200");
        }else if(!isCodeEmpty(dynamicCode)){
          json.put("code", "codeError");
        }else{
          json.put("code", "needCode");
        }
      }
      
    }else if(user.getLabType()!=null&&user.getLabType().equals("2")){
      
      json.put("mobile", user.getMobile());
      if(checkSessionCode(session)){
        json.put("code", "200");
        System.out.println("sessionCode not null:200..............................");
      }else if(!isCodeEmpty(dynamicCode)&&checkDynamicCode(session,dynamicCode)){
        json.put("code", "200");
      }else if(!isCodeEmpty(dynamicCode)){
        json.put("code", "codeError");
      }else{
        json.put("code", "needCode");
      }
      
    } 
    
    return json;
    
  }
  
  public static String readKey(){
    String key = null;
    try {
      Ukey.loadLibrary();
      key = Ukey.getSerialId();
      LOG.error("the key is :"+key+".............................");
    } catch (Exception e) {
      LOG.error("no lib...");
      return null;
    }
    if(key==null || key.equals("null") || key.length()==0){
      return null;
    }else{
      return key;
    }
  }
  
  public static boolean checkDynamicCode(HttpSession session,String dynamicCode){
    User user = (User)session.getAttribute("user");
    if(user.getMobile()==null || user.getMobile().length()==0){
      return false;
    }
    String rs = ApiUtil.checkShortMessage(user.getUsername(),dynamicCode);
    System.out.println(rs);
    try {
      JSONObject json = JSONObject.parseObject(rs);
      String code = json.getString("code");
      if(code.equals("200")){
        session.setAttribute(SESSION_CODE, dynamicCode);
        session.setAttribute(SESSION_TIME, new Date().getTime());
        return true;
      }
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
    return false;
  }
  
  public static boolean createMobileCode(User user){
    if(user.getMobile()==null || user.getMobile().length()==0){
      return false;
    }
    String rs = ApiUtil.getShortMessage(user.getUsername());
    System.out.println(rs);
    try {
      JSONObject json = JSONObject.parseObject(rs);
      String code = json.getString("code");
      if(code.equals("200")){
        return true;
      }
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
    return false;
  }
  
  public static final String SESSION_CODE = "sessionCode";
  public static final String SESSION_TIME = "sessionTime";
  public static final Long SESSION_TIME_SPACING = 1000 * 60 * 30l;
  
  public static void main(String args[]){
    String key=DatasourceSecurityRankUtil.readKey();
    System.out.println("key+"+key);
  }
  
}
